package cn.yeziji.forum.converter;

import cn.yeziji.forum.basic.netty.user.UserMessage;
import cn.yeziji.forum.bo.user.UserRegisterBO;
import cn.yeziji.forum.common.AuthUser;
import cn.yeziji.forum.dto.user.UserRegisterDTO;
import cn.yeziji.forum.dto.user.UserUpdateDTO;
import cn.yeziji.forum.entity.ForumUserEntity;
import cn.yeziji.forum.vo.user.UserMsgVO;
import cn.yeziji.forum.vo.user.UserUpdateVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * 用户转换器
 *
 * @author gzkemays
 * @since 2021/12/21 16:31
 */
@Mapper
public interface UserConverter {
  UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);
  /**
   * 实体类转换未 auth 用户类
   *
   * @param entity 实体类user
   * @return {@link AuthUser}
   */
  @Mappings({
    @Mapping(target = "enabled", expression = "java(java.lang.Boolean.TRUE)"),
    @Mapping(target = "accountNonExpired", expression = "java(java.lang.Boolean.TRUE)"),
    @Mapping(target = "accountNonLocked", expression = "java(java.lang.Boolean.TRUE)"),
    @Mapping(target = "credentialsNonExpired", expression = "java(java.lang.Boolean.TRUE)")
  })
  AuthUser entityConvertToAuth(ForumUserEntity entity);

  /**
   * 用户注册数据转 entity
   *
   * @param dto 传输数据 dto
   * @return 用户数据
   */
  @Mapping(target = "nickname", source = "username")
  @Mapping(
      target = "password",
      expression =
          "java(cn.yeziji.forum.common.PasswordSecurity.generatedPassword(dto.getPassword()))")
  ForumUserEntity userRegConvertToEntity(UserRegisterDTO dto);
  /**
   * 实体类转换为 ForumUserEntity
   *
   * @param dto
   * @return cn.yeziji.forum.entity.ForumUserEntity
   */
  ForumUserEntity convertUserEntityByDto(UserUpdateDTO dto);

  /**
   * 注册 bo 转 user entity
   *
   * @param bo 用户注册 bo 数据传输对象
   * @return 用户数据
   */
  @Mapping(target = "nickname", source = "username")
  ForumUserEntity convertUserEntityByRegisterBo(UserRegisterBO bo);
  /**
   * entity 转化为用户信息对象
   *
   * @param entity entity
   * @return 用户信息
   */
  UserMsgVO convertToUserMsgByEntity(ForumUserEntity entity);

  /**
   * entity列表转化为用户信息对象列表
   *
   * @param entities entity列表
   * @return 用户信息
   */
  List<UserMsgVO> convertToUserMsgByEntities(List<ForumUserEntity> entities);

  /**
   * dto 转化为用户更新数据返回对象
   *
   * @param dto 用户 dto
   * @return 用户更新数据返回对象
   */
  UserUpdateVO convertUploadVoByDto(UserUpdateDTO dto);

  /**
   * usermsg vo 转通知用户
   *
   * @param vo 视图对象
   * @return 通知用户数据类型
   */
  UserMessage convertToUserMessageByVo(UserMsgVO vo);

  /**
   * usermsg vo 转通知用户
   *
   * @param vo 视图对象
   * @return 通知用户数据类型
   */
  List<UserMessage> convertToUserMessageByVos(List<UserMsgVO> vo);
}
